package cn.by.wms.config;

import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 自定义权限评估器，用于实现对用户权限的细粒度检查。
 * 该类实现了Spring Security的PermissionEvaluator接口，以自定义方式判断用户是否拥有特定权限。
 */
@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {
    /**
     * 检查用户是否对特定对象具有指定的权限。
     * @param authentication 用户的认证信息，包含用户的角色和权限。
     * @param targetDomainObject 需要检查权限的对象。
     * @param permission 指定的权限字符串。
     * @return 如果用户具有指定权限，则返回true；否则返回false。
     */
    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
        switch (permission.toString()){
            case "PO_REPEAL":
                // 1. targetDomainObject  这个就是采购单id ，
                // 2. 去数据库查询这个采购单当时的采购人是谁 B
                // 3. 当前这个人是不是 B
                // 4. 是 -> true
                // 5. 不 -> false
                return true;
            default:
                // 获取用户的权限集合
                Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
                List<? extends GrantedAuthority> collect = authorities.stream().filter(item -> item.getAuthority().equals(permission.toString())).collect(Collectors.toList());
                if(collect.size() > 0){
                    return true;
                }
                break;
        }
        // 如果遍历完所有权限仍未找到匹配的，则返回false
        return false;
    }
    /**
     * 检查用户是否对特定ID和类型的对象具有指定的权限。
     * 该方法目前未实现，计划用于未来更细粒度的权限检查。
     * @param authentication 用户的认证信息，包含用户的角色和权限。
     * @param targetId 需要检查权限的对象的ID。
     * @param targetType 需要检查权限的对象的类型。
     * @param permission 指定的权限字符串。
     * @return 目前该方法总是返回false。
     */
    @Override
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
        // 目前未实现，返回false
        return false;
    }
}